package com.xuexiang.yoyo.runenable;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;

public class TokenFile {
    private static final String TAG = "TokenFile";
    private static final String TOKEN_KEY = "token";

    private static final String tokenFileName = ".app-token";
    //    private static final String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + uuidFileName;
    private static String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;

    private static String Token = "";

    @SuppressLint("SdCardPath")
    public static String readToken(Context context) throws Exception {
        filePath = "/data/data/" + context.getPackageName() + File.separator + tokenFileName;
        Log.d(TAG, "readToken: " + filePath);
        // 读取顺序，sp file
        Token = getFromSP(context);
        if (Token != null) {
            return Token;
        }
        Token = getFromFile();
        if (Token != null) {
            // 如果能够从文件中获取，表示应用卸载了，需要重新给SP赋值
            setToSP(context, Token);
            return Token;
        }
        return null;
    }

    public static void clearToken(Context context) throws Exception {
        writeToken(context, "");
    }

    public static String writeToken(Context context, String token) throws Exception {
        filePath = "/data/data/" + context.getPackageName() + File.separator + tokenFileName;
        Log.d(TAG, "writeToken: " + filePath);
        // 将UUID保存到SP、外部存储目录
        setToSP(context, token);
        setToFile(token);
        return token;
    }

    /**
     * 从SharedPreferences中读取UUID
     */
    private static String getFromSP(Context context) throws Exception {
        String token = SPUtil.getString(context, TOKEN_KEY, "");
        if (!TextUtils.isEmpty(token)) {
            // sp中有值，更新一下系统数据库和外置存储文件
            updateFile(token);
            return token;
        }
        return null;
    }


    /**
     * 从文件读取UUID
     */
    private static String getFromFile() throws Exception {
        File file = new File(filePath);
        if (!file.exists()) {
            return null;
        }
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
        // 读取一行即可
        return bufferedReader.readLine();
    }


    /**
     * 检测外部存储目录是否有该UUID，没有则更新，没有表示文件被用户清除了
     */
    private static void updateFile(String token) throws Exception {
        File file = new File(filePath);
        // 如果文件不存在，则表示被清理了，
        if (!file.exists()) {
            boolean newFile = file.createNewFile();
            writeData(token);
        } else {
            // 如果文件存在，则需要对比一下sp中和文件中的是否一致
            String fileToken = getFromFile();
            // 如果不相等，则表示被篡改了，需要更新
            if (!token.equals(fileToken)) {
                setToFile(token);
            }
        }
    }

    /**
     * 保存到sp
     */
    private static void setToSP(Context context, String token) {
        SPUtil.putString(context, TOKEN_KEY, token);
    }

    /**
     * 保存到文件
     */
    private static void setToFile(String token) throws Exception {
        File file = new File(filePath);
        if (file.exists()) {
            file.delete();
        }
        file.createNewFile();
        writeData(token);
    }

    /**
     * 将UUID写入文件
     */
    private static void writeData(String token) throws Exception {
        FileOutputStream fos = new FileOutputStream(filePath);
        fos.write(token.getBytes());
        fos.close();
    }

}
